﻿IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'ArticuloActualizaInventario')
BEGIN
	DROP  Procedure ArticuloActualizaInventario
END
GO

CREATE PROCEDURE ArticuloActualizaInventario
	(	
		@empresaId AS INT,
		@articuloId AS VARCHAR(13),
		@cantidad AS DECIMAL(12,2),
		@costo AS MONEY			
	)	
AS
BEGIN	
	SET NOCOUNT ON

	DECLARE @existencia AS DECIMAL(12,2)	
	DECLARE @costoPromedioActual AS MONEY
	DECLARE @costoPromedioNuevo AS MONEY
	
	SET @existencia = 0

	-- Obtiene la existencia del artículo en la empresa
	SELECT @existencia = isnull(sum(axb_existencia),0)
    FROM    articulo_x_bodega
    WHERE emp_id = @empresaId
	  AND art_id = @articuloId

	-- Movimientos interbodega que no han sido recibidos
	SELECT @existencia = @existencia + isnull(sum(c.detalle_cantidad),0)	
    FROM   mov_inventario_encabezado a
	INNER JOIN tipo_mov_inventario b 
		ON	b.emp_id = a.emp_id 
		AND b.tipo_id = a.tipo_id 	
	INNER JOIN mov_inventario_detalle c 
		ON	c.emp_id = a.emp_id
		AND c.suc_id = a.suc_id 
		AND c.bod_id = a.bod_id 
		AND c.mov_id = a.mov_id 
    WHERE a.emp_id = @empresaId
	  AND a.mov_aplicado = 'si'
	  AND a.mov_recibido = 'no'
	  AND b.tipo_inter_bodega = 'si'	  
	  AND c.art_id = @articuloId
	  
	-- Pedidos que no han sido recibidos
	SELECT @existencia = @existencia + isnull(sum(b.detalle_despachado),0)
	FROM   pedido_encabezado a
	INNER JOIN pedido_detalle b
		ON  b.emp_id = a.emp_id 
		AND b.suc_id = a.suc_id 
		AND b.bod_id = a.bod_id 
		AND b.dpto_id = a.dpto_id 
		AND b.pedido_id = a.pedido_id
	WHERE a.emp_id = @empresaId 
	  AND a.pedido_aplicado = 'si' 
	  AND a.pedido_recibido = 'no'
	
	
	-- Calcula y actualiza costos en la tabla de Articulos
	SELECT @costoPromedioActual = art_costo_actual	
	FROM Articulo
	WHERE emp_id = @empresaId
	  AND art_id = @articuloId

	IF @existencia = 0 			
        SET @costoPromedioNuevo = @costo
    ELSE		
		SET @costoPromedioNuevo = (@existencia * @costoPromedioActual + @cantidad * @costo) / (@existencia + @cantidad)
	
	IF @costoPromedioNuevo <> @costoPromedioActual 
	BEGIN
		UPDATE articulo 
		SET art_costo_trasanterior  = art_costo_anterior,
			art_costo_anterior      = art_costo_actual,
			art_costo_actual        = @costoPromedioNuevo,
			art_costo_ultima_compra = @costo, 			
			art_fec_actualizacion   = getdate()			
		WHERE emp_id = @empresaId
		  AND art_id = @articuloId
    END
    ELSE
	BEGIN
		UPDATE articulo 
		SET art_costo_ultima_compra = @costo,
			art_fec_actualizacion   = getdate()
		WHERE emp_id = @empresaId
		  AND art_id = @articuloId
    END    
  	
	SET NOCOUNT OFF
END
GO